//
//  VIUAccount.h
//  JGVividEngine
//
//  Created by jagger.tu on 2022/11/29.
//  Copyright © 2022 CloudSky All rights reserved.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface JGTicket : NSObject

/// 凭证过期的时间戳，精确到毫秒。
@property (nonatomic, strong) NSString *timestamp;

/// 生成凭证的唯一随机数。不同桶之间需要使用不同的随机值。
@property (nonatomic, strong) NSString *nonce;

/// 临时认证密钥
@property (nonatomic, strong) NSString *ticket;

/// 创建一个凭证实例
/// @param ticket 临时密钥
/// @param nonce 随机值
/// @param timestamp 过期时间戳
+ (instancetype)ticketWithTicket:(NSString *)ticket nonce:(NSString *)nonce timestamp:(NSString *)timestamp;

@end


/// 运行的环境类型
typedef NS_ENUM(NSInteger, JGEnvironment) {
    /// 默认环境
    JGEnvironmentDefault = 0,
    /// 自建正式环境
    JGEnvironmentProduction = JGEnvironmentDefault,
    /// 自建测试环境
    JGEnvironmentTest = 1,
    /// 咪咕环境
    JGEnvironmentMigu = 2,
    /// 香港环境
    JGEnvironmentHK = 3,
};

/// 认证账户
@interface JGAccount : NSObject

/// 排队优先级：1-9，值越小，排队时优先级越高。默认值为 0，优先级最低。
@property (nonatomic, strong, nullable) NSNumber *queueLevel;

/// 资源集 ID：每个资源集管理多个资源。当用户指定资源集 ID 时，系统会尝试从指定的资源集中为用户分配空闲资源。
@property (nonatomic, strong, nullable) NSNumber *rsetId;

/// 外部用户 ID，非必填。为空表示自动注册。
@property (nonatomic, strong, nullable) NSString *userID;

/// 外部用户令牌，非必填。为空时自动注册。
@property (nonatomic, strong, nullable) NSString *token;

///  应用ID
@property (nonatomic, strong, nullable) NSString *appID;

/// 外部用户唯一 ID
@property (nonatomic, strong, nullable) NSString *appUserId;

/// 访问密钥，从客服获取
@property (nonatomic, strong) NSString *accessKey;

/// 业务 ID，从客服获取
@property (nonatomic, strong, nullable) NSString *bizID;

/// 访问密钥密钥，从客服获取
@property (nonatomic, strong, nullable) NSString *accessKeySecret;

/// 凭证用于临时认证用户，是一种更安全的访问方式，相关流程由后台返回。
@property (nonatomic, strong, nullable) JGTicket *ticket;

/// 预留字段
@property (nonatomic, strong, nullable) NSString *reserve;

/// 特殊场景下使用，例如调试
@property (nonatomic, strong, nullable) NSString *reserve_d;

/// 推荐为生产或测试指定特定环境
@property (nonatomic, assign) JGEnvironment environment;

/// 是否使用测试用户标签
@property (nonatomic, assign) BOOL bTestUser;

/// 是否为演示模式
@property (nonatomic, assign) BOOL isDemo;

/// 是否使用debug流配置
@property (nonatomic, assign) BOOL bDebugStreamConfigure;

/// 用户应用参数，例如 @{@"usercode": @"xxxx", @"phone": @"156 *****"}
@property (nonatomic, strong) NSDictionary *appJsonData;

/// 快速启动，直接使用 accessKeySecret，使用自动注册
/// @param accessKey 从客服或对接人员获取
/// @param accessKeySecret 从客服或对接人员获取
+ (instancetype)accountWithAccessKey:(NSString *)accessKey accessKeySecret:(NSString *)accessKeySecret;

/// 更安全的方式，所有请求都需要签名，使用自动注册
/// @param ticket 建议通过服务器获取
/// @param accessKey 从客服或对接人员获取
+ (instancetype)accountWithTicket:(JGTicket *)ticket accessKey:(NSString *)accessKey;

/// 快速启动，直接使用 accessKeySecret，不使用自动注册
/// @param userID 外部 userID，从后台获取
/// @param token 外部 token，后台接入
/// @param accessKey 从客服或对接人员获取
/// @param accessKeySecret 从客服或对接人员获取
+ (instancetype)accountWithUserID:(NSString * _Nullable)userID
                            token:(NSString * _Nullable)token
                        accessKey:(NSString *)accessKey
                  accessKeySecret:(NSString *)accessKeySecret;

/// 更安全的方式，所有请求都需要签名，不使用自动注册
/// @param ticket 建议通过后台获取
/// @param accessKey 从客服或对接人员获取
/// @param userID 外部 userID，从后台获取
/// @param token 外部 token，后台接入
+ (instancetype)accountWithTicket:(JGTicket *)ticket
                        accessKey:(NSString *)accessKey
                           userID:(NSString *_Nullable)userID
                            token:(NSString * _Nullable)token;

@end

NS_ASSUME_NONNULL_END
